package utils

import (
	"fmt"
	"learnGo/gormLearn/model"
	"time"

	"github.com/astaxie/beego/logs"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
)

//变量信息
var (
	MysqlDb *gorm.DB
	LogRXL  *logs.BeeLogger
)

//只需要实现Print 方法就可以实现数据库日志输出
type logger struct {
}

//实现Print 的方法
func (log *logger) Print(values ...interface{}) {
	// 输出的mysql操作日志内容
	LogRXL.Info("%v %v %v %v %v %v", values...)
}

//beego 的日志初始化
func initLog() {
	LogRXL = logs.NewLogger()
	_ = LogRXL.SetLogger("console")
	_ = LogRXL.SetLogger(logs.AdapterFile, `{"filename":"./gormLearn/gorm.log","daily":true,"maxdays":10,"color":true}`)
	LogRXL.EnableFuncCallDepth(true)
	LogRXL.SetLogFuncCallDepth(2)
}

//数据库配置信息的获取
func dbInfoInit() string {
	//dbHost := beego.AppConfig.String("dbHost")
	//dbPort := beego.AppConfig.String("dbPort")
	//dbUser := beego.AppConfig.String("dbUser")
	//dbPwd := beego.AppConfig.String("dbPwd")
	//dbName := beego.AppConfig.String("dbName")
	dbHost := "123.57.250.120"
	dbPort := "3306"
	dbUser := "root"
	dbPwd := "123456"
	dbName := "beifengBeego"
	return fmt.Sprintf(fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
		dbUser,
		dbPwd,
		dbHost,
		dbPort,
		dbName))
}

func init() {
	//Beego 日志初始化
	initLog()
	//mysql 的数据连接
	var connectDbErr error
	MysqlDb, connectDbErr = gorm.Open("mysql", dbInfoInit())
	//当连接失败后直接抛出异常
	if connectDbErr != nil {
		panic(connectDbErr)
	}
	//Db的参数设置
	setupDB()
	//持续监测与数据库之间的连接
	go keepAlive(MysqlDb)
	LogRXL.Info("---> %s", "connect mysql success")
}

//db参数配置
func setupDB() {
	//去掉表名称后面自带s
	MysqlDb.SingularTable(true)
	//同步struct 到mysql
	MysqlDb.AutoMigrate(model.Person{})
	//MysqlDb.Debug()
	// 用于设置闲置的连接数.设置闲置的连接数则当开启的一个连接使用完成后可以放在池里等候下一次使用。
	MysqlDb.DB().SetMaxIdleConns(2)
	// 用于设置最大打开的连接数，默认值为0表示不限制.设置最大的连接数，可以避免并发太高导致连接mysql出现too many connections的错误。
	MysqlDb.DB().SetMaxOpenConns(20000)
	//开始数据库操作日志
	MysqlDb.LogMode(true)
	//可以直接将gorm 的sql 日志输出在beego 中的logs 中
	MysqlDb.SetLogger(&logger{})
}

//检测与mysql 的连接
func keepAlive(d *gorm.DB) {
	for {
		err := d.DB().Ping()
		if err != nil {
			LogRXL.Info("%s", " mysql lost connect")
		}
		time.Sleep(60 * time.Second)
	}
}
